package com.feng.d16openclosedprinciple.badsmell;

import lombok.Data;

/**
 * 通知类
 * 坏味道的代码
 * @author LiYilin on 2020/4/9
 */
@Data
public class Alert {

    private AlertRule alertRule;
    private Notification notification;

    public Alert(AlertRule alertRule, Notification notification) {
        this.alertRule = alertRule;
        this.notification = notification;
    }

    /**
     * 代码核心部分就是check函数,现在的功能是监控接口的tps和错误数量统计,超过阈值就报警
     * 现在想要扩展功能,让check函数支持  当每秒钟接口 `超时请求个数` ，超过某个预先设置的最大阈值时，我们也要触发告警发送通知
     * 需要改动两个地方: 1.入参添加一个新的统计数据 timeoutCount  2.新增一个新的报警逻辑
     * 不好的地方在于: 1.改了入参,所有调用此函数的地方都要修改  2修改了check函数,需要重新进行单元测试
     */
    public void check(String api, long requestCount, long errorCount, long durationOfSeconds) {
        long tps = requestCount / durationOfSeconds;
        //alertRule.getMatchedRule(api).getMaxTps()
        if (tps > alertRule.getMatchedRule(api)) {
            notification.notify(NotificationEmergencyLevel.URGENCY, "...");
        }
        //alertRule.getMatchedRule(api).getMaxErrorCount()
        if (errorCount > alertRule.getMatchedRule(api)) {
            notification.notify(NotificationEmergencyLevel.SEVERE, "...");
        }
    }

}
